 /*******************************************************************************
  * Copyright (c) 2000, 2005 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
  * Contributors:
  * IBM Corporation - initial API and implementation
  *******************************************************************************/
 package org.eclipse.core.resources.ant;

 import java.util.Hashtable ;
 import org.apache.tools.ant.BuildException;
 import org.apache.tools.ant.Task;
 import org.eclipse.ant.core.AntCorePlugin;
 import org.eclipse.core.resources.*;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IProgressMonitor;

 /**
  * Ant task which runs the platform's incremental build facilities.
  *
  * @see IProject#build(int, IProgressMonitor)
  * @see IWorkspace#build(int, IProgressMonitor)
  */
 public class IncrementalBuild extends Task {
     private String builder;
     private String project;
     private int kind = IncrementalProjectBuilder.INCREMENTAL_BUILD;

     /**
      * Unique identifier constant (value <code>"incremental"</code>)
      * indicating that an incremental build should be performed.
      */
     public final static String KIND_INCREMENTAL = "incremental"; //$NON-NLS-1$

     /**
      * Unique identifier constant (value <code>"full"</code>)
      * indicating that a full build should be performed.
      */
     public final static String KIND_FULL = "full"; //$NON-NLS-1$

     /**
      * Unique identifier constant (value <code>"auto"</code>)
      * indicating that an auto build should be performed.
      */
     public final static String KIND_AUTO = "auto"; //$NON-NLS-1$

     /**
      * Unique identifier constant (value <code>"clean"</code>)
      * indicating that a CLEAN build should be performed.
      */
     public final static String KIND_CLEAN = "clean"; //$NON-NLS-1$

     /**
      * Constructs an <code>IncrementalBuild</code> instance.
      */
     public IncrementalBuild() {
         super();
     }

     /**
      * Executes this task.
      *
      * @exception BuildException thrown if a problem occurs during execution
      */
     public void execute() throws BuildException {
         try {
             IProgressMonitor monitor = null;
             Hashtable references = getProject().getReferences();
             if (references != null)
                 monitor = (IProgressMonitor) references.get(AntCorePlugin.ECLIPSE_PROGRESS_MONITOR);
             if (project == null) {
                 ResourcesPlugin.getWorkspace().build(kind, monitor);
             } else {
                 IProject targetProject = ResourcesPlugin.getWorkspace().getRoot().getProject(project);
                 if (builder == null)
                     targetProject.build(kind, monitor);
                 else
                     targetProject.build(kind, builder, null, monitor);
             }
         } catch (CoreException e) {
             throw new BuildException(e);
         }
     }

     /**
      * Sets the name of the receiver's builder.
      *
      * @param value the name of the receiver's builder
      */
     public void setBuilder(String value) {
         builder = value;
     }

     /**
      * Sets the receiver's kind> attribute. This value must be one
      * of: <code>IncrementalBuild.KIND_FULL</code>,
      * <code>IncrementalBuild.KIND_AUTO</code>,
      * <code>IncrementalBuild.KIND_INCREMENTAL</code>,
      * <code>IncrementalBuild.KIND_CLEAN</code>.
      *
      * @param value the receiver's kind attribute
      */
     public void setKind(String value) {
         if (IncrementalBuild.KIND_FULL.equalsIgnoreCase(value))
             kind = IncrementalProjectBuilder.FULL_BUILD;
         else if (IncrementalBuild.KIND_AUTO.equalsIgnoreCase(value))
             kind = IncrementalProjectBuilder.AUTO_BUILD;
         else if (IncrementalBuild.KIND_CLEAN.equalsIgnoreCase(value))
             kind = IncrementalProjectBuilder.CLEAN_BUILD;
         else if (IncrementalBuild.KIND_INCREMENTAL.equalsIgnoreCase(value))
             kind = IncrementalProjectBuilder.INCREMENTAL_BUILD;
     }

     /**
      * Sets the receiver's target project.
      *
      * @param value the receiver's target project
      */
     public void setProject(String value) {
         project = value;
     }
 }

